package day5;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;

//测试反射:  测试Person类
public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //1.获取类对象
        Class c1=Person.class;
        Class c2=Class.forName("day5.Person");
        Person p=new Person("张三",18);
        Class c3=p.getClass();
        //2.通过类对象动态获取类中的所有资源
        //c1.getXXX();
        String name=c1.getName();
        System.out.println("全类名:"+name);
        String simpleName=c1.getSimpleName();
        System.out.println("类名:"+simpleName);
        String superName=c1.getSuperclass().getSuperclass().getName();
        System.out.println("父类全类名:"+superName);
        System.out.println("==========获取属性Field=============");
        //获取该类中不包括父类的属性
        Field[] fs=c1.getDeclaredFields();
        for(Field f:fs){
            String fieldName=f.getName();
            Class type=f.getType();
            System.out.println("属性名:"+fieldName+" 类型:"+type);
        }
        System.out.println("--------------------");
        //获取该类中所有公开属性(父类的...)
        Field[] fs2=c1.getFields();
        for(Field f:fs2){
            String fieldName=f.getName();
            Class type=f.getType();
            System.out.println("属性名:"+fieldName+" 类型:"+type);
        }
        //获取一个属性(如果是私有的如何获取)
        Field f1=c1.getDeclaredField("name");//私有的
        Field f2=c1.getDeclaredField("time");//共有的
        //设置属性值 获取属性值
        f2.set(p,new Date()); //等价于p.time=new Date()
        Object value=f2.get(p); //等价于p.time
        System.out.println("日期属性:"+value);
        //如果是私有属性  如何处理
        f1.setAccessible(true);//开启私有访问
        f1.set(p,"黄斌斌");
        Object value2=f1.get(p);
        System.out.println("姓名属性:"+value2);
    }
}
